import html2Canvas from 'html2canvas'
import jsPDF from 'jspdf'
import Vue from 'vue'

export async function generatingPDF(dom, name, callback, errCallBack) {
  try {
    const shareContent = dom // 需要截图的包裹的（原生的）DOM 对象
    const width = shareContent.offsetWidth // //获取dom 宽度 包含4像素滚动条
    const height = shareContent.offsetHeight // //获取dom 高度
    const newCanvas = document.createElement('canvas') // 创建一个canvas节点
    const scale = 1
    newCanvas.width = width * scale // 定义canvas 宽度 * 缩放
    newCanvas.height = height * scale // 定义canvas高度 *缩放
    newCanvas.style.width = shareContent.offsetWidth * scale + 'px'
    newCanvas.style.height = shareContent.offsetHeight * scale + 'px'
    newCanvas.getContext('2d').scale(scale, scale) // 获取context,设置scale
    const opts = {
      canvas: newCanvas, // 自定义 canvas
      logging: false, // 日志开关，便于查看html2canvas的内部执行流程
      width: width, // dom 原始宽度
      height: height,
      useCORS: true, // 【重要】开启跨域配置
      scale: 1
    }
    const canvas = await html2Canvas(dom, { ...opts })
    // const canvas = await html2Canvas(dom, {
    //   allowTaint: true,
    //   backgroundColor: '#FFF', // 一定要设置背景颜色，否则有的浏览器就会变花~，比如Edge
    //   useCORS: true,
    //   scale: 1
    // })
    // eslint-disable-next-line new-cap
    const pdf = new jsPDF('l', 'mm', 'a4') // A4纸，p纵向 l横向
    const ctx = canvas.getContext('2d')
    const a4w = 297
    const a4h = 210 // A4大小，210mm x 297mm，四边各保留10mm的边距，显示区域190x277
    const imgHeight = a4h * canvas.width / a4w // 按A4显示比例换算一页图像的像素高度
    let renderedHeight = 0
    while (renderedHeight < canvas.height) {
      const page = document.createElement('canvas')
      page.width = canvas.width
      page.height = Math.min(imgHeight, canvas.height - renderedHeight)// 可能内容不足一页
      // 用getImageData剪裁指定区域，并画到前面创建的canvas对象中
      page.getContext('2d').putImageData(ctx.getImageData(0, renderedHeight, page.width, page.height), 0, 0)
      pdf.addImage(page.toDataURL('image/jpeg', 1), 'JPEG', 0, 0, a4w, Math.min(a4h, a4w * page.height / page.width)) // 添加图像到页面，保留10mm边距
      renderedHeight += imgHeight
      if (renderedHeight + 15 < canvas.height) { pdf.addPage() }// 如果后面还有内容，添加一个空页
    }
    pdf.save(`${name}${Vue.prototype.$formatDate(new Date(), '{y}_{m}_{d}')}.PDF`)
    if (callback) {
      callback()
    }
  } catch (err) {
    console.log(err)
    if (errCallBack) {
      errCallBack()
    }
  }
}
